Présentation du document :

Ce document R markdown regroupe les éléments l’analyse effectuée par Sara Oukkal et Xinyue Jiang sur les données issues de l’article Microbial Biogeography of Public Restroom Surfaces de Gilberto E. et al.

Les graphiques générés par ce script pourront être retrouvés dans notre poster (Quelques modifications ont été faites sur le script après présentation du poster : ajout d’un graphique sunburst interactif, correction d’erreurs et normalisation de la heatmap).

Vous y trouverez les étapes de préparation et formatage des données, les questions que nous nous sommes posés, les graphiques qui y répondent ainsi que les conclusions biologiques associées.

Pour obtenir le visuel de R markdown il faut l’executer à partir du git ou se trouvent les données pour générer les figures. Ensuite il faut le knit (tricoter) en HTML pour avoir la mise en forme du document.

I) Préparation des données :

1- Packages R :

#Fonction pour installer et charger les packages R:
fun_packages <- function(x){
  for( i in x ){
    if( ! require( i , character.only = TRUE ) ){
      #Si le package ne peut pas être chargé, on l'installe
      install.packages( i , dependencies = TRUE )
      #Charger le package après l'installation
      require( i , character.only = TRUE )
    }
  }
}

#Liste des packages necessaires:
packages=c("ggplot2" , "plotly" , "data.table","datasets","stringr","tibble","plyr","reshape","ade4","viridis","tidyverse","dplyr") 
#Lancer la fonction de chargement/installation: 
fun_packages(packages)
## Le chargement a nécessité le package : ggplot2
## Le chargement a nécessité le package : plotly
## 
## Attachement du package : 'plotly'
## L'objet suivant est masqué depuis 'package:ggplot2':
## 
##     last_plot
## L'objet suivant est masqué depuis 'package:stats':
## 
##     filter
## L'objet suivant est masqué depuis 'package:graphics':
## 
##     layout
## Le chargement a nécessité le package : data.table
## Le chargement a nécessité le package : stringr
## Le chargement a nécessité le package : tibble
## Le chargement a nécessité le package : plyr
## 
## Attachement du package : 'plyr'
## Les objets suivants sont masqués depuis 'package:plotly':
## 
##     arrange, mutate, rename, summarise
## Le chargement a nécessité le package : reshape
## 
## Attachement du package : 'reshape'
## Les objets suivants sont masqués depuis 'package:plyr':
## 
##     rename, round_any
## L'objet suivant est masqué depuis 'package:data.table':
## 
##     melt
## L'objet suivant est masqué depuis 'package:plotly':
## 
##     rename
## Le chargement a nécessité le package : ade4
## Le chargement a nécessité le package : viridis
## Le chargement a nécessité le package : viridisLite
## Le chargement a nécessité le package : tidyverse
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ tidyr   1.2.0     ✓ dplyr   1.0.8
## ✓ readr   2.1.2     ✓ forcats 0.5.1
## ✓ purrr   0.3.4
## Warning: le package 'readr' a été compilé avec la version R 4.1.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::arrange()   masks plyr::arrange(), plotly::arrange()
## x dplyr::between()   masks data.table::between()
## x purrr::compact()   masks plyr::compact()
## x dplyr::count()     masks plyr::count()
## x tidyr::expand()    masks reshape::expand()
## x dplyr::failwith()  masks plyr::failwith()
## x dplyr::filter()    masks plotly::filter(), stats::filter()
## x dplyr::first()     masks data.table::first()
## x dplyr::id()        masks plyr::id()
## x dplyr::lag()       masks stats::lag()
## x dplyr::last()      masks data.table::last()
## x dplyr::mutate()    masks plyr::mutate(), plotly::mutate()
## x dplyr::rename()    masks reshape::rename(), plyr::rename(), plotly::rename()
## x dplyr::summarise() masks plyr::summarise(), plotly::summarise()
## x dplyr::summarize() masks plyr::summarize()
## x purrr::transpose() masks data.table::transpose()

2- Charger les données :

Le fichier VDB_16S_metadata.txt contient le nombre de bactéries dans chaque échantillon et VDB_16S_dataset.txt contient les informations qualitatives des endroits d’ou proviennent les échantillons.

#Charger les fichiers : 
data_info=read.csv("data/VDB_16S_metadata.txt", 
                     header = TRUE, sep = "\t")
data_OTU=read.csv("data/VDB_16S_dataset.txt", 
                  header = TRUE, sep = "\t")

head(data_info)
##        SampleID Gender Floor Building        Surface
## 1  EKCM2.489495   Male     C   Ekeley       Door out
## 2  EKBM8.489473   Male     B   Ekeley Faucet handles
## 3  EKCF4.489498 Female     C   Ekeley      Stall out
## 4  PTBM9.489505   Male     B   Porter Soap dispenser
## 5 EKBF10.489552 Female     B   Ekeley     Sink floor
## 6  PTAM4.489517   Male     A   Porter      Stall out
head(data_OTU)
##   X.OTU.ID EKCM2.489495 EKBM8.489473 EKCF4.489498 PTBM9.489505 EKBF10.489552
## 1   469478            3            5            7            3             0
## 2   208196            0            0            0            0             1
## 3   378462            0            0            0            0             0
## 4   265971            0            0            0            0             1
## 5   570812            0            0            0            0             0
## 6   213370            0            0            0            0             0
##   PTAM4.489517 EKCM1.489478 EKAM4.489564 EKCM7.489464 EKAM1.489459 EKBM2.489466
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            2            2            8            2           35           12
## 4            0            0            0            0            0            0
## 5            0            0            0            2            0            0
## 6            0            0            0            0            0            0
##   EKCM8.489573 PTCM3.489508 EKCF1.489542 EKCF2.489571 PTAF1.489471 EKCF8.489457
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            1           14            6            4            4            1
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   EKCM4.489509 PTAM8.489453 PTAM3.489461 EKAM8.489462 PTAM6.489451 PTAF8.489480
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            3            1            1            4            1            1
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   EKAM6.489544 EKBF8.489493 PTCM1.489536 EKBF1.489501 EKBM10.489477
## 1            0            0            0            0             0
## 2            0            0            0            0             0
## 3            1            1            3            1             0
## 4            0            0            0            0             0
## 5            0            0            0            0             2
## 6            0            0            0            0             0
##   EKAM7.489572 PTBM10.489535 EKCF7.489557 PTAM10.489487 EKAF10.489503
## 1            0             0            0             0             0
## 2            0             0            0             0             0
## 3            0             0            0             0             0
## 4            0             0            0             0             0
## 5            1             0            0             0             0
## 6            0             1            0             0             0
##   PTBF10.489566 EKCM10.489502 PTBF9.489570 EKBM7.489474 PTBM6.489476
## 1             0             0            0            0            0
## 2             0             0            0            0            0
## 3             0             0            0            0            0
## 4             0             0            0            0            0
## 5             0             0            0            0            0
## 6             0             0            0            0            0
##   PTAF10.489458 PTCF5.489507 PTCF6.489533 EKAM10.489518 EKAF5.489565
## 1             0            0            0             0            0
## 2             0            0            0             0            0
## 3             0            0            0             0            0
## 4             0            0            0             0            0
## 5             0            0            0             0            0
## 6             0            0            0             0            0
##   PTCM10.489512 EKCF10.489541 PTAF7.489568 EKBF7.489524 PTAM7.489553
## 1             0             0            0            0            0
## 2             0             0            0            0            0
## 3             0             0            0            0            0
## 4             0             0            0            0            0
## 5             0             0            0            0            0
## 6             0             0            0            0            0
##   PTBF7.489532 PTCF3.489529 PTCF2.489540 PTCF1.489467 PTCM9.489527 EKCF5.489488
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   PTCF9.489454 PTCF4.489538 PTCM4.489484 PTBF5.489479 PTCM7.489468 PTCM5.489525
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   EKBF2.489510 EKCF6.489456 PTCF10.489534 PTAM5.489496 EKCM6.489475
## 1            0            0             0            0            0
## 2            0            0             0            0            0
## 3            0            0             0            0            0
## 4            0            0             0            0            0
## 5            0            0             0            0            0
## 6            0            0             0            0            0
##   EKAF7.489567 EKAF6.489460 EKCM5.489561 PTAF9.489513 PTCM2.489469 PTCM8.489465
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   PTBM4.489490 EKBM4.489515 EKBM3.489450 EKBF4.489491 PTAM9.489543 EKAF4.489521
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   EKAM5.489530 PTBM7.489547 EKCF9.489499 PTBM2.489516 EKAF9.489500 PTAF6.489492
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   PTAF2.489522 PTBM8.489497 EKBM9.489548 EKAF8.489558 PTCM6.489574 EKAF2.489569
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   EKBF5.489551 EKAF1.489470 PTBM3.489559 PTAM2.489554 PTCF7.489531 EKBM6.489504
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   EKBF9.489520 PTBF2.489545 EKBM5.489472 PTAF5.489560 EKAF3.489546 PTCF8.489486
## 1            0            0            0            0            0            0
## 2            0            0            0            0            0            0
## 3            0            0            0            0            0            0
## 4            0            0            0            0            0            0
## 5            0            0            0            0            0            0
## 6            0            0            0            0            0            0
##   EKCM9.489514 PTBF4.489483 PTBF1.489562 B6.489449 B5.489455 B1.489537
## 1            0            0            0         0         0         0
## 2            0            0            0         0         0         0
## 3            0            0            0         0         0         0
## 4            0            0            0         0         0         0
## 5            0            0            0         0         0         0
## 6            0            0            0         0         0         0
##   B3.489528 B2.489526
## 1         0         0
## 2         0         0
## 3         0         0
## 4         0         0
## 5         0         0
## 6         0         0
##                                                                                                                                        ConsensusLineage
## 1                                                    k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Catonella; s__
## 2 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Methylobacteriaceae; g__Methylobacterium; s__Methylobacterium organophilum
## 3                                                   k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Staphylococcaceae; g__Staphylococcus; s__
## 4                                        k__Bacteria; p__Actinobacteria; c__Actinobacteria (class); o__Actinomycetales; f__Pseudonocardiaceae; g__; s__
## 5                                           k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Rhodospirillaceae; g__; s__
## 6                             k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Bdellovibrionales; f__Bdellovibrionaceae; g__Bdellovibrio; s__

3- Formater des données :

Différents traitements des données (parfois indépendants les uns des autres) pour pouvoir réaliser les graphiques du poster.

#Preprocessing des données : 
##Renommer les lignes du dataset :
rownames(data_OTU) <- make.names(data_OTU$X.OTU.ID)

##Split la colonne de taxonomie en 6 et renommer les colonnes:
Taxonomy = data_OTU$ConsensusLineage 
Tax_split=str_split_fixed(Taxonomy, ";", n=6)
colnames(Tax_split) <- c("Domaine","Phylum","Classe","Ordre", "Famille", "Genre")
tax=as.data.frame(Tax_split)

##Nettoyer les noms de phyla :
Phylum_sep=as.data.frame(str_split_fixed(tax$Phylum, "_",n=3))
Phylum_names=Phylum_sep$V3

##Obtenir les niveaux taxonomiques : 
###Niveaux taxonomiques : 1-Domaine, 2-Phylum, 3-Classe, 4-Ordre, 5-Famille, 6-Genre
###A partir du tableau tax retirer la colonne Genre qui est très fragmentée et incomplète : 
Tax_trim=subset(as.data.frame(tax), select = -Genre)
###Retirer les k__, p__ (Nettoyer les niveaux taxonomiques): 
Tax_trim$Domaine <- gsub("k__", "" , as.character(Tax_trim$Domaine))
Tax_trim$Phylum <- gsub("p__", "" , as.character(Tax_trim$Phylum))
Tax_trim$Classe <- gsub("c__", "" , as.character(Tax_trim$Classe))
Tax_trim$Ordre <- gsub("o__", "" , as.character(Tax_trim$Ordre))
Tax_trim$Famille <- gsub("f__", "" , as.character(Tax_trim$Famille))
###Additionner toutes les cases de chaque ligne du document data_OTU, total abondance pour chaque espèce (somme des échantillons) :
summed <- rowSums(data_OTU[, c(2:110)])
summed_ab <- as_tibble(summed)
###Ajouter la colonne abondance au tableau des niveaux taxonomiques : 
Tax_trim$Abondance = summed_ab$value

##Combiner les abondances avec les données qualitatives des sources d'échantillonage :  
###Formater les deux tableaux:
data_reOTU=data_OTU[,-1]
data_OTU_pret=subset(as.data.frame(data_reOTU), 
                     select = -ConsensusLineage)
data_transOTU=as.data.frame(t(data_OTU_pret))
data_transOTU$SampleID=rownames(data_transOTU)
###Fusion des deux tableaux :
merge_data=merge(data_info,data_transOTU,by.x="SampleID",
                 by.y="SampleID")
#Renommer les colonnes :
new_data=merge_data[,-c(1,2,3,4,5)]
colnames(new_data) <- make.names(Phylum_names)

II) Plots :

1- Sunburst - Niveaux taxonomiques :

Question : Quelle est la diversité des bactéries qu’on retrouve dans les toilettes publiques ?

Ce plot sunburst interactif nous permet de visualiser les niveaux taxonomiques des bactéries retrouvées dans les échantillons issus des toilettes publiques ainsi que leur répartition en fonction de leur abondance.

Les niveaux sont : Phylum, Classe et Ordre. Nous n’utilisons pas les niveaux taxonomiques plus bas car ils contiennent beaucoup d’inconnus (faible résolution).

#Sunburst: 
##On retire la première colonne "Domaine" car ici tous les organismes correspondent à des bactéries. 
prepare_sunbrust=Tax_trim[,-1]
##On range les données par groupe (combiner les colonnes qui présentent le même Ordre) : 
group_by_sunbrust=ddply(prepare_sunbrust, .(Phylum, Classe, Ordre), numcolwise(sum))

##Faire le plot: 
as.sunburstDF <- function(DF, valueCol = NULL){
  require(data.table)
  
  colNamesDF <- names(DF)
  
### Vérifier si les données sont sous forme de tableau : 
  if(is.data.table(DF)){
    DT <- copy(DF)
  } else {
    DT <- data.table(DF, stringsAsFactors = FALSE)
  }
  
### Déterminer les parents : 
  DT[, root := names(DF)[1]]
  colNamesDT <- names(DT)
  
  if(is.null(valueCol)){
    setcolorder(DT, c("root", colNamesDF))
  } else {
    setnames(DT, valueCol, "values", skip_absent=TRUE)
    setcolorder(DT, c("root", setdiff(colNamesDF, valueCol), "values"))
  }
  
### Faire des groupes hiérarchiques pour chaque parent : 
  hierarchyCols <- setdiff(colNamesDT, "values")
  hierarchyList <- list()
  for(i in seq_along(hierarchyCols)){
    currentCols <- colNamesDT[1:i]
    if(is.null(valueCol)){
      currentDT <- unique(DT[, ..currentCols][, values := .N, by = currentCols], by = currentCols)
    } else {
      currentDT <- DT[, lapply(.SD, sum, na.rm = TRUE), by=currentCols, .SDcols = "values"]
    }
    setnames(currentDT, length(currentCols), "labels")
    hierarchyList[[i]] <- currentDT
  }
  
  hierarchyDT <- rbindlist(hierarchyList, use.names = TRUE, fill = TRUE)
  
  parentCols <- setdiff(names(hierarchyDT), c("labels", "values", valueCol))
  hierarchyDT[, parents := apply(.SD, 1, function(x){fifelse(all(is.na(x)), yes = NA_character_, no = paste(x[!is.na(x)], sep = ":", collapse = " - "))}), .SDcols = parentCols]
  hierarchyDT[, ids := apply(.SD, 1, function(x){paste(x[!is.na(x)], collapse = " - ")}), .SDcols = c("parents", "labels")]
  hierarchyDT[, c(parentCols) := NULL]
  return(hierarchyDT)
}

DF <- as.data.table(group_by_sunbrust)
setcolorder(DF, c("Phylum", "Classe", "Ordre","Abondance"))
sunburstDF <- as.sunburstDF(DF, valueCol = "Abondance")
plot_ly(data = sunburstDF, ids = ~ids, labels= ~labels, parents = ~parents, values= ~values, type='sunburst', branchvalues = 'total')

2- Barplot - Abondance Phyla :

Question : Y a t’il des types de bactéries plus abondants que d’autres ?

Barplot qui représente l’abondance de chaque phylum dans la somme des échantillons.

Remarque : Depuis la présentation du poster, nous avons inversé les axes pour qu’ils correspondent bien aux bonnes valeurs.

#Barplot : 
##Formater le tableau des niveaux taxonomiques pour ne garder que les phyla et leur abondance :
##Fusionner les lignes avec le même phylum pour additionner leurs abondances :

Phylum=subset(as.data.frame(Tax_trim), select = Phylum)
Phylum$Abondance = summed_ab$value
Phylum_agg=aggregate(Abondance ~ Phylum, Phylum, sum)
Phylum_agg = Phylum_agg[order(Phylum_agg$Abondance),]

##Créer un vecteur avec un nombre de couleurs suffisant pour tous les Phylum: (les palettes préfaites ne présentent pas assez de couleurs)
couleur<-c("#C4961A", "#F4EDCA", "#00AFBB", "#E7B800",
           "#D16103", "#C3D7A4", "#52854C", "#4E84C4", "#293352",
           "#00AFBB", "#E7B800", "#FC4E07","#FFDB6D", "#C4961A", "#F4EDCA", 
          "#D16103", "#C3D7A4", "#52854C", "#4E84C4", "#293352","#999999", 
          "#E69F00", "#56B4E9", "#009E73",
          "#F0E442", "#0072B2", "#D55E00", "#CC79A7","#FFDB6D")

##Faire le barplot: 
ggplot(Phylum_agg, aes(Abondance,reorder(Phylum, +Abondance), fill=Phylum)) + 
  scale_fill_manual(values = couleur)+
  geom_col() +
  theme_classic()+
  scale_x_continuous(position="top")+
  ggtitle("Diversité et abondance des bactéries qu'on retrouve dans les toilettes")+
  xlab("Abondance") + 
  ylab("Type de bactéries")+
  theme(plot.title = element_text(size = 15),axis.text.x = element_text(angle = 45, hjust = -0.25,size=15),axis.text.y=element_text(size=15),axis.title.x= element_text(size=15),axis.title.y= element_text(size=15))

Forte diversité de bactéries retrouvées dans nos échantillons, néanmoins 5 groupes sont dominants en terme d’abondance : - Les actinobactéries et Les cyanobactéries (principalement retrouvées dans le sol) - Les protéobactéries ( certaines sont des pathogènes de l’Homme comme E. esherichia coli et salmonella, mais d’autres composent la flore vaginale) - Les firmicutes (certains sont des pathogènes de l’Homme comme Streptocuccus) - Les Bacteroidetes (qui sont les bactéries du microbiote intestinal).

3- Stacked barplot - Abondance des Phyla de bactéries sur chaque surface :

Question : Est-ce que la distribution des bactéries est équivalente sur les différentes surfaces ?

Représentation de l’abondance de bactéries des échantillons issus des différentes surfaces de toilettes publiques. Chaque baton est subdivisé en fonction du type de Phyla qu’on retrouve sur la surface correspondante.

## Warning in RColorBrewer::brewer.pal(n, pal): n too large, allowed maximum for palette Set3 is 12
## Returning the palette you asked for with that many colors

On voit que la distribution des phyla est assez équivalente entre les surfaces sauf l’eau qui présente une composition différente. Les actinobactéries sont les bactéries les plus nombreuses, sauf dans l’eau ou on en retrouve très peu. Cette différence de l’eau par rapport aux autres milieu vient du fait que c’est le seul échantillon qui n’est pas en contact avec l’Homme.

Quant à l’abondance des bactéries sur ces surfaces, elle est assez variable, avec le robinet qui présente la plus grande quantité de bactéries car c’est l’endroit qu’on touche le plus longtemps.

4- Analyse en composante principale - Explication de la variation présente entre surfaces et composition bactérienne :

Question : Est-ce que ces organismes proviennent tous du même milieu ou d’environnements différents ?

On regroupe les surfaces en 4 groupes: Les surfaces touchées par les mains, le sol touché par les chaussures, la cuvette des toilettes et l’eau. Les bactéries sont regroupées par familles.

#ACP : 
##On récupère les abondances de chaque échantillon pour chaque famille de bactéries: 
colnames(new_data) <- make.names(Tax_trim$Famille)
data_foracp=new_data

##Renommer les surfaces en 4 groupes (Mains, sol, toilettes et eau) : 
data_foracp$NewSurface[merge_data$Surface == 'Door out'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Door in'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Faucet handles'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Sink floor'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Soap dispenser'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Stall in'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Stall out'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Toilet Floor'] <- "Sol"
data_foracp$NewSurface[merge_data$Surface == 'Toilet flush handle'] <- "Mains"
data_foracp$NewSurface[merge_data$Surface == 'Toilet seat'] <- "Toilettes"
data_foracp$NewSurface[merge_data$Surface == "Water"] <- "Eau"

##Calculer l'ACP: 
rownames(data_foracp)=make.names(data_foracp$NewSurface,unique=T)
data_acp=subset(data_foracp,select=-NewSurface)
acp <- prcomp(data_acp, center = TRUE, scale = TRUE)
data_pca=data.frame(acp$x,data_foracp$NewSurface)
###Choisir la dimension à représenter: (Nous avons 108 facteurs qui expliquent la variabilité, choisir deux facteurs qui expliquent une bonne partie de la variabilité)
new_df <- cbind(data_foracp$NewSurface,data_pca[,c(2,22)])
###Renommer les colonnes des résultats de l'ACP : 
colnames(new_df) <- c("Source_de_echantillon", "Facteur1", "Facteur2")

##Faire le plot : 
ggplot(new_df, aes(x=Facteur1, y=Facteur2, col = Source_de_echantillon, 
                            fill = data_foracp$NewSurface))+
  stat_ellipse(geom = "polygon", col= "black", alpha =0.5)+
  geom_point(shape=21, col="black")+
  xlim(-50,50)+
  ylim(-50,50)+
  ggtitle("Analyse en composante principale sur ce qui touche les surfaces 
          et les familles de bactéries associées")+
  xlab("Facteur 1") + 
  ylab("Facteur 2")+
  guides(fill=guide_legend(title="Sources de l'échantillon"))+
  theme_bw() +
  theme_light()+
  theme(aspect.ratio=1)+
  theme(plot.title = element_text(size = 15),axis.text.x = element_text(size=15),axis.text.y=element_text(size=15),axis.title.x= element_text(size=15),axis.title.y= element_text(size=15))
## Warning: Removed 3 rows containing non-finite values (stat_ellipse).
## Warning: Removed 3 rows containing missing values (geom_point).

On peut distinguer deux groupes différents : - Les bactéries associées à l’Homme, qui sont les plus abondantes provenant probablement du microbiote de la peau et du microbiote intestinal. - les bactéries associées à l’environnement qui sont les plus diversifiéet qui correspondent à des bactéries du sol.

5- Heatmap - Abondance des bactéries en fonction :

Question : Est-ce qu’il y a des toilettes qui ont plus de bactéries que les autres ? Est ce que l’endroit d’où provient l’échantillon influence les résultats ?

Remarque : Depuis la présentation du poster, nous avons modifié les données utilisées pour faire la heatmap en normalisant les valeurs d’abondance par type de bactéries (pour pas que les bactéries très abondantes masquent la variabilité qu’on peut retrouver chez les bactéries moins abondantes)

#Préparation des données pour le plot
data_heatmap=as.data.frame(aggrate_bacterie)
## Filtrer les bactéries qui présentent une trop faible abondance : 
need_to_go_heat=Filter(function(x) sum(abs(x), na.rm = TRUE) < 1000, data_heatmap)
data_ready_heat=data_heatmap[, !(colnames(data_heatmap) %in% colnames(need_to_go_heat))]

## Ajouter les paramètres de la heatmap : 
data_ready_heat$Gender=merge_data$Gender
data_ready_heat$Floor=merge_data$Floor
data_ready_heat$Building=merge_data$Building

## Traduire le genre en français : 
data_ready_heat$Gender[data_ready_heat$Gender == "Female"]  <- "Femme"
data_ready_heat$Gender[data_ready_heat$Gender == "Male"] <- "Homme"

## Regrouper les données en fonction des 3 paramètres :  
data_group_by=data_ready_heat %>%
  group_by( Gender, Building, Floor) %>%
  summarise_all(sum)

## Réorganiser le tableau
data_heat_pret=as.data.frame(data_group_by)
data_heat_pret$Info <- paste(data_heat_pret[,1], data_heat_pret[,2], data_heat_pret[,3], sep="_")
rownames(data_heat_pret)=make.names(data_heat_pret$Info,unique=T)

## Supprimer les colonnes dont on ne se sert pas : 
pret_heat=data_heat_pret[, !(colnames(data_heat_pret) %in% c("Gender","Floor","Building"))]

## Fusionner les données d'abondance avec les informations : 
info_melt=melt(pret_heat,id=c("Info"))

## Retirer les localisations qui ne sont pas des toilettes pour hommes ou femmes : 
info_melt=info_melt[info_melt$Info != "None_Ekeley_A" 
          & info_melt$Info != "None_Ekeley_B" 
          & info_melt$Info != "None_Ekeley_C"  
          & info_melt$Info != "None_Porter_A" 
          & info_melt$Info != "None_Porter_B" 
          & info_melt$Info != "None_Porter_C", ]

## Normaliser les valeurs d'abondance par type de bactérie : 
getNorm <- function(data){
  datalist<-list()
  types<-unique(data$variable)
  i=0
  for (type in types){
    i=i+1
    subset<-subset(data, variable==type)
    line_max_abun <- subset %>%
      filter(value == max(value, na.rm = TRUE))
    max_abun<-line_max_abun$value
    subset$NormAbundance<-subset$value/max_abun
    
    datalist[[i]] <- subset
  }
  newData <- do.call(rbind, datalist)
  return(newData)
}

info_melt_norm<-getNorm(info_melt)

#Séparer les données de Genre des informations de localisation (pas très propre pourrait être fait en amont)
temporary_df=as.data.frame(str_split_fixed(info_melt_norm$Info, "_", n=2) )
info_melt_norm$Info=temporary_df$V2
info_melt_norm$Gender=temporary_df$V1


##Plot heatmap :
ggp_heatmap <- ggplot(info_melt_norm, aes(Info, variable)) + 
  geom_tile(aes(fill = NormAbundance))+
  scale_fill_viridis_c(option = "D", direction = 1)+
  theme(plot.title = element_text(size = 15),axis.text.x = element_text(angle = 45, hjust = 1),axis.text.y=element_text(size=15),axis.title.x= element_text(size=15),axis.title.y= element_text(size=15))+
  facet_grid(. ~ Gender )+
  ggtitle("Répartition des types de bactéries dans les échantillons issus de toilettes différentes ")+
  xlab("Provenance des échantillons") + 
  ylab("Abondance des bactéries ")

ggp_heatmap

Les toilettes pour hommes présentent plus d’Actinobactéries mais les toilettes pour femmes présentent plus de Protéobactéries (qui sont des bactéries qui composent 25% de la flore vaginale) et de Fusobactéries.

Malheureusement nous n’avons pas les noms des espèces car ils permettraient d’avoir des conclusions biologiques sur la raison de cette différence entre Hommes et Femmes qui peut venir de différences de microbiotes.

On voit aussi que l’immeuble Porter est plus propre que Ekeley au moment ou les échantillons ont été prélevés, que ce soit aux toilettes pour Hommes ou pour femmes les toilettes de l’immeuble Porter présentent moins d’abondance de bactéries que Ekeley.

Donc l’abondance en bactéries varie en fonction des toilettes échantillonnées.

Conclusion :

Ces résultats montrent que les échantillons des toilettes abritent des groupes de bactéries diverses parmi lesquels on distingue deux grandes communautés : les bactéries associées à l’Humain et celles associées à l’environnement.

Malheureusement la résolution taxonomique de l’étude ne permet pas d’attester des différences réelles entre les échantillons et donc de faire des conclusions biologiques.